import { createRouter, createWebHistory } from 'vue-router';
import type { RouteRecordRaw } from 'vue-router';
import { publicPath } from '@/config/index';
import { routesWhiteList, loginInterception } from '@/config/index';
import MainRoutes from './MainRoutes';
import AuthRoutes from './AuthRoutes';
import { useAuthStore } from '@/stores/auth';
import PublicRoutes from './publicIndex';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
import { useMenuStore } from '@/stores/menu';

// 配置 NProgress
NProgress.configure({
  easing: 'ease',
  speed: 500,
  trickleSpeed: 200,
  showSpinner: false,
});

// 基础路由配置
export const constantRoutes: RouteRecordRaw[] = [];

// 动态路由配置
export const asyncRoutes: RouteRecordRaw[] = [];

// 根路径重定向
// const rootRedirect: RouteRecordRaw = {
//   path: '/',
//   redirect: '/'
// };

// 创建路由实例
export const router = createRouter({
  history: createWebHistory(publicPath),
  routes: [
    PublicRoutes,
    // MainRoutes,
    AuthRoutes,
    ...asyncRoutes
  ],
  scrollBehavior: () => ({ top: 0 })
});

// 路由守卫
router.beforeEach(async (to, from, next) => {
  // console.log('=== 路由守卫开始 ===');
  // console.log('目标路由:', to.path);

  // 开始进度条
  NProgress.start();

  // 获取认证 store
  const authStore = useAuthStore();
  const menuStore = useMenuStore();


  // 判断是否有 token
  const hasToken = authStore.accessToken;

  // 如果有 token
  if (hasToken) {
    // console.log("有token，用户名:", authStore.username);


    // 如果访问登录页，直接重定向到首页
    if (to.path === '/auth/login') {
      next({ path: '/index' });
      NProgress.done();
      return;
    }

    // 检查是否需要恢复路由
    // console.log('=== 路由恢复检查 ===');
    // console.log('menuStore.routes.length:', menuStore.routes.length);
    // console.log('router.hasRoute("main"):', router.hasRoute('main'));
    // console.log('当前所有路由:', router.getRoutes().map(r => ({ name: r.name, path: r.path })));

    // 检查主路由是否有子路由
    const mainRoute = router.getRoutes().find(r => r.name === 'main');
    // console.log('主路由详情:', mainRoute);
    // console.log('主路由子路由数量:', mainRoute?.children?.length || 0);

    // 检查是否为页面刷新
    const isPageRefresh = from.name === null && from.path === '/';

    // 修改条件：如果有缓存数据但主路由没有子路由，或者是页面刷新，则需要恢复
    if (menuStore.routes.length > 0 && ((!mainRoute?.children || mainRoute.children.length === 0) || isPageRefresh)) {
      // console.log('从缓存恢复路由...');
      const restored = menuStore.restoreRoutesFromCache();
      // console.log('路由恢复结果:', restored);
      // console.log('恢复后的路由:', router.getRoutes().map(r => ({ name: r.name, path: r.path })));

      // 路由恢复后，重新导航到目标路由
      // console.log('路由恢复完成，重新导航到:', to.path);
      next({ ...to, replace: true });
      NProgress.done();
      return;
    } else {
      // console.log('跳过路由恢复 - 主路由已有子路由或无缓存数据');
    }

    // 如果没有动态路由，需要获取
    if (menuStore.routes.length === 0) {
      // console.log('=== 动态路由获取 ===');
      // console.log('动态路由未注册，开始获取...');
      try {
        const routes = await menuStore.getRouterList();
        // console.log('动态路由注册完成，获取到的路由数量:', routes?.length || 0);
        // console.log('注册后的所有路由:', router.getRoutes().map(r => ({ name: r.name, path: r.path })));
        // console.log('重新导航到:', to.path);
        next({ ...to, replace: true });
        NProgress.done();
        return;
      } catch (error) {
        // console.error('获取动态路由失败:', error);
        authStore.logout();
        next(`/auth/login?redirect=${to.path}`);
        NProgress.done();
        return;
      }
    }

    // 检查用户信息
    if (!authStore.username) {
      // console.log('用户信息缺失，重新获取...');
      try {
        await authStore.getUserInfo();
      } catch (error) {
        // console.error('获取用户信息失败:', error);
        authStore.logout();
        next(`/auth/login?redirect=${to.path}`);
        NProgress.done();
        return;
      }
    }

    // console.log('=== 最终路由匹配检查 ===');
    // console.log('目标路径:', to.path);
    // console.log('匹配的路由数量:', to.matched.length);
    // console.log('匹配的路由详情:', to.matched.map(m => ({ name: m.name, path: m.path, component: m.components })));
    // console.log('当前所有已注册路由:', router.getRoutes().map(r => ({ name: r.name, path: r.path })));

    // 检查路由是否匹配
    if (to.matched.length === 0) {
      // console.log('❌ 路由未匹配，跳转到404页面');
      // console.log('可能的原因：');
      // console.log('1. 路由未正确注册');
      // console.log('2. 路径不匹配');
      // console.log('3. 动态路由恢复失败');
      next('/auth/404');
    } else {
      // console.log('✅ 路由匹配成功，允许访问');
      next();
    }

    NProgress.done();
  } else {
    // 未登录
    if (routesWhiteList.includes(to.path)) {
      // 在免登录白名单中，直接进入
      next();
    } else {
      // 否则全部重定向到登录页
      next(`/auth/login?redirect=${to.path}`);
      NProgress.done();
    }
  }

  // console.log('=== 路由守卫结束 ===');  
});

router.afterEach(() => {
  // 结束进度条
  NProgress.done();
});

export default router;
